package learn.up.java.algorithm;

import org.junit.Test;

/**
 *移位运算符
 * @author NANUTO
 * @date 2017年11月21日 上午12:29:51
 */
public class Shifting {

	@Test
	public void leftShift() {
		/*
		 * 左移位 <<, 符号位不变，低位补0。如：2<<2结果为8
		 *     当移动的位数超过数字本身的位数时，那么不就都需要补0操作，实际上不是的，
		 * java不可能做那么浪费资源的事情。在真正执行位移前，其对要移动的位数做了
		 * 一些预处理，比如32处理为0，-1处理为31.
		 */
		System.out.println(5 << 2);  //20
		System.out.println(5 << 32); //左移32等于左移0
		//常见用法  1.m * 2 ^ n,m乘以2的n次方，可以用左移位
		System.out.println(5 << 3); // 5 * 2 ^ 3
		//2.判断一个数n的奇偶性
		int n = 9;
		System.out.println( (n & 1) == 1 ? "奇数" : "偶数"  );
		
	}
	
	@Test
	public void rightShift() {
		/*
		 * 右移位 >>,符号位不变，并用符号位补溢出的高位。即若是正数，则高位补0，负数补1
		 * -6>>2结果为-2。
		 */
		System.out.println(8 >> 2);
	}
	
	@Test
	public void test3() {
		/*
		 * 无符号右移 >>>,低位溢出，高位补0
		 * 无符号右移（>>>）中的符号位（最高位）也跟着变，无符号的意思是将符号位当作数字位看待。
		 */
		System.out.println(-14 >>> 3);
	}
	@Test
	public void test4() {
		System.out.println((1 << 16)  -6 );
		/*
		 * 十进制转其他进制
		 */
		System.out.println(Integer.toBinaryString(8143));
		System.out.println(Integer.toOctalString(35));
		System.out.println(Integer.toHexString(35));
		/*
		 * 其他进制转10进制
		 */
		System.out.println(Integer.parseInt("100001100101", 2));
		System.out.println(Integer.parseInt("2347526", 8));
		System.out.println(Integer.parseInt("afb67cd", 16));
		System.out.println(Integer.parseInt("2bc", 16));
	}
}
